using System.Collections;
using System.Collections.Generic;
using System.Linq;
using Nekonya.Const;
using Nekonya.Dicts;
using Nekonya.Managers;
using TinaX;
using TinaX.UIKit;
using TinaX.UIKit.Components;
using TinaX.XComponent;
using UnityEngine;
using UnityEngine.UI;

namespace Nekonya.UI
{
    public class BagScreenSimple : XUIBehaviour
    {
        [Binding("btn_close")]
        public Button Btn_Close { get; set; }

        [Binding("go_bag_items_content")]
        public GameObject Go_ItemsContent { get; set; }

        [Binding("go_bag_item")]
        public GameObject Go_Item { get; set; }


        [Inject]
        public BagManager BagManager { get; set; }

        [Inject]
        public DictFactory DictFactory { get; set; }

        [Inject]
        public IUIKit UIKit { get; set; }

        private Transform m_TransItemContent;

        private ItemDict m_ItemDict;

        public override void Awake()
        {
            Go_Item.Hide(); //这玩意相当于是母版，仅用于复制，自身不作显示，所以隐藏掉。（所以它并没有放在content里面）
            m_TransItemContent = Go_ItemsContent.transform;

            Btn_Close.onClick.AddListener(() =>
            {
                this.Close();
            });

            DictFactory.GetDictAsync<ItemDict>(dict => //加载字典定义
            {
                m_ItemDict = dict;

                //开始刷UI
                RefreshBagItem();
            });
            
        }

        public override void Start()
        {
            XEvent.Call(EventConst.DisablePlayerControllerInput);
        }

        public override void OnDestroy()
        {
            XEvent.Call(EventConst.EnablePlayerControllerInput);
        }


        private void RefreshBagItem()
        {
            Debug.Log("开始刷背包Items");
            //清空Transform中（可能）已有内容
            for(var i = m_TransItemContent.childCount - 1; i >= 0; i--)
            {
                m_TransItemContent.GetChild(i).gameObject.Destroy();
            }

            //得到数据
            var bag_data = BagManager.GetAll();

            Debug.Log("背包数据量：" + bag_data.Count());
            //刷数据
            foreach(var item in bag_data)
            {
                var go = GameObject.Instantiate(Go_Item, m_TransItemContent)
                    .Name($"Item_{item.Id}")
                    .Show();

                uint num = item.Number;

                //数据模板
                var tpl = m_ItemDict.Get(item.Id);

                //数量
                var txt_num = go.transform.Find("num").GetComponent<Text>();
                txt_num.text = item.Number.ToString();

                //图标
                var icon_path = $"Assets/Arts/UI/Images/items/{tpl.Icon}.png"; //这里是为了更加容易理解逻辑才把拼接图标加载路径的代码写在UI逻辑里，实际上不应该这么干。
                var ximg_icon = go.transform.Find("mask/icon").GetComponent<XImage>(); //XImage可以理解为我们魔改过后的Image，它可以根据图片文件的路径来实时的显示图片。对于没有框架的白板Unity，可以先粗略的使用Resources类来加载图片资产。
                ximg_icon.SetSpritePathAsync(icon_path, err => { });

                //品质
                var img_side = go.transform.Find("side").GetComponent<Image>();
                //品质决定了显示的边框颜色，这里照理说项目应该由美术统一几个颜色，并定义在什么常量里，
                //对于学技术而言我们只要知道有这么个事就行了，下面就瞎写几个颜色了
                switch (tpl.Quality)
                {
                    default:
                        img_side.color = Color.black;
                        break;
                    case 1:
                        img_side.color = Color.cyan;
                        break;
                    case 2:
                        img_side.color = Color.blue;
                        break;
                }

                //点击事件
                var btn = go.transform.Find("mask/icon").GetComponent<Button>();
                btn.onClick.RemoveAllListeners(); //先别管为什么，反正只要是动态刷出来的UI，按钮一律加一句这个，先养成习惯，理由以后再说。
                btn.onClick.AddListener(() =>
                {
                    //注意，这个lambda方法里面，不可以访问foreach循环上的item变量，但可以访问局部变量tpl

                    Debug.Log("按钮被点击了，点的是:" + m_ItemDict.GetName(tpl));
                    this.UIKit.OpenUI("itemInfo", new ItemInfoScreen(), new OpenUIParam { UseMask = true, CloseByMask = true }, tpl, num);
                });
            }
        }

    }

}
